package _嗖嗖移动大厅2_0.A3_0;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

public class _1 {

    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(8888);
        while (true) {
            Socket accept = ss.accept();
            System.out.println("连接成功");
            new Serverthread(accept).start();
        }
    }
}

class Serverthread extends Thread implements Serializable{

    private  Socket socket;
    Map<String, Kehu> map=new ConcurrentHashMap<>();
    List<_taocan> list1=new ArrayList<>();
    public Serverthread() {
    }
    {
        list1.add(new _taocan("话唠套餐",200,50,58,0));
        list1.add(new _taocan("网虫套餐",0,0,68,5));
        list1.add(new _taocan("超人套餐",200,100,78,1));
    }
    public Serverthread(Socket socket) {
        this.socket = socket;
    }
    //序列化
public void xuliehua(){
    ObjectOutputStream oos=null;
    try {
        oos= new ObjectOutputStream(new FileOutputStream("C:\\Users\\董\\IdeaProjects\\JAVA76\\高级特性\\src\\_嗖嗖移动大厅2_0\\A3_0\\客户信息.txt"));
        oos.writeObject(map);
        oos.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        try {
            if (oos!=null){
                oos.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
    //反序列化
public void fa(){

    ObjectInputStream ois=null;
    try {
        ois= new ObjectInputStream(new FileInputStream("C:\\Users\\董\\IdeaProjects\\JAVA76\\高级特性\\src\\_嗖嗖移动大厅2_0\\A3_0\\客户信息.txt"));
        //if(ois.readObject()!=null) {
            map = (Map<String, Kehu>) ois.readObject();
            System.out.println(map);
       // }
    } catch (Exception e) {
        //e.printStackTrace();

    }finally {
        try {
            if (ois!=null){
                ois.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
    @Override
    public void run() {
      fa();
        InputStream is = null;
        OutputStream os = null;
        BufferedReader br = null;
        PrintWriter pw = null;
        try {
            is = socket.getInputStream();
            os = socket.getOutputStream();
            br = new BufferedReader(new InputStreamReader(is));
            pw = new PrintWriter(os);
        js: while (true) {
            pw.println("*********欢迎使用嗖嗖移动大厅*********\n1.用户登录,2.用户注册,3.使用嗖嗖,4.话费充值,5.资费说明,6.退出系统,输入end退出");
            pw.println("请选择:");
            pw.println("");
            pw.flush();
            String s = br.readLine();
            System.out.println(s);
            int x = 3;//用计数,账号密码输入错误3次返回上级
            bb: while (true) {
                if (Objects.equals(s, "1")) {
                    if (x <3) {
                        if (x==0) {
                            break;
                        }
                        pw.println("密码输入错误,还有"+x+"机会:");
                    }
                    pw.println("请输入手机号码:");
                    pw.println("");
                    pw.flush();
                    String s1 = br.readLine();
                    System.out.println(s1);
                    pw.println("请输入密码:");
                    pw.println("");
                    pw.flush();
                    String s2 = br.readLine();
                    System.out.println(s2);
                    x--;
                    if (map.containsKey(s1)&&map.get(s1).getPass().equals(s2)) {
                        while (true) {
                            pw.println("*****嗖嗖移动用户菜单*****");
                            pw.println("1.本月账单查询");
                            pw.println("2.套餐余量查询");
                            pw.println("3.打印消费详单");
                            pw.println("4.套餐变更");
                            pw.println("5.办理退网");
                            pw.println("请选择(输入1~5选择功能,其他键返回上级)");
                            pw.println("");
                            pw.flush();
                            String s3 = br.readLine();
                            switch (s3) {
                                case "1":
                                    pw.println("账单查询");
                                    pw.println("手机号:" + map.get(s1) + "当月账单:");
                                    pw.println("套餐资费:" + map.get(s1).getTa().getFeiyong());
                                    pw.println("账户余额:" + map.get(s1).getMoney());
                                    break;
                                case "2":
                                    pw.println("套餐余量查询");
                                    pw.println("手机号:" + map.get(s1) + "套餐剩余:");
                                    pw.println(map.get(s1).getTa()._1());
                                    break;
                                case "3":
                                    pw.println("打印消费订单");
                                    pw.println("手机号:" + map.get(s1) + "消费记录:");
                                    if (map.get(s1).getList().size()==0){
                                        break;
                                    }
                                    pw.println("序号\t类型\t数据(通话(条)/短信(条)上网(MB))");
                                    for (int i = 0; i < map.get(s1).getList().size(); i++) {
                                        pw.println((i + 1) + "\t" + map.get(s1).getList().get(i).getA() + "\t" + map.get(s1).getList().get(i).getB());
                                    }
                                    break;
                                case "4":
                                    pw.println("套餐变更");
                                    for (int i = 0; i < list1.size(); i++) {
                                        pw.println((i+1)+"."+list1.get(i).getTaocan());
                                    }
                                    pw.println("请输入(序列号):");
                                    pw.println("");
                                    pw.flush();
                                    int i = Integer.parseInt(br.readLine());
                                    if (Objects.equals(list1.get(i - 1).getTaocan(), map.get(s1).getTa().getTaocan())){
                                        pw.println("您已是该套餐的用户");
                                    }else if (list1.get(i-1).getFeiyong()<map.get(s1).getMoney()){
                                        map.get(s1).setTa(list1.get(i-1));
                                        pw.println("更换套餐成功");
                                    }else {
                                        pw.println("对不起,您的余额不足以支付新套餐本月资费,请充值后再办理更换套餐业务!");
                                    }
                                    break;
                                case "5":
                                    pw.println("办理退网");
                                    pw.println("请输入您的手机号:");
                                    pw.println("");
                                    pw.flush();
                                    String s4 = br.readLine();
                                    pw.println("请输入您的密码:");
                                    pw.println("");
                                    pw.flush();
                                    String s5 = br.readLine();
                                    if (map.containsKey(s4)&&map.get(s1).getPass().equals(s5)){
                                        map.remove(s4);
                                        pw.println("删除成功");
                                        break bb;
                                    }else {
                                        pw.println("账号密码错误");
                                        break;
                                    }
                                default:
                                    break bb; //跳出双重循环返回主页面
                            }
                        }
                    }
                } else if (Objects.equals(s,"2")){
                        pw.println("可选择的卡号如下:");
                        String[] ar=new String[10];
                        for (int i = 0; i < 9; i++) {
                            int a = (int)(Math.random() * 100000000);
                            String p="198"+a;
                            ar[i]=p;
                            pw.print((i+1)+"."+ar[i]+"\t");
                            if ((i+1)%3==0){
                                pw.println("");
                            }
                        }
                        pw.println("请选择(1~9):");
                        pw.println("");
                        pw.flush();
                        int i = Integer.parseInt(br.readLine())-1; //号码
                        if (i<0||i>9){
                        pw.println("无此选项,返回主菜单");
                        break;
                        }
                        String xx="198"+i;
                        map.put(xx,new Kehu());
                        pw.println("1.话痨套餐,2.网虫套餐,3.超人套餐, 请选择套餐:");
                        pw.println("");
                        pw.flush();
                        int i1 = Integer.parseInt(br.readLine())-1;//套餐
                        map.get(xx).setTa(list1.get(i1));
                        pw.println("输入姓名:");
                        pw.println("");
                        pw.flush();
                        String s3 = br.readLine();//姓名
                        map.get(xx).setName(s3);
                        pw.println("请输入密码:");
                        pw.println("");
                        pw.flush();
                        String s4 = br.readLine();//密码
                        map.get(xx).setPass(s4);
                        pw.println("请输入预存话费:");
                        pw.println("");
                        pw.flush();
                        int s5 = Integer.parseInt(br.readLine());//话费
                        while (s5<map.get(xx).getTa().getFeiyong()){
                            pw.println("您的预存话费不足以支付本月固定资费,请重新充值:");
                            pw.println("");
                            pw.flush();
                            s5=Integer.parseInt(br.readLine());
                        }
                        map.put(ar[i],new Kehu(list1.get(i1),s3,s4,s5-list1.get(i1).getFeiyong()));
                        pw.println("注册成功!卡号:"+ar[i]+" 用户名:"+s3+" 当前余额"+map.get(ar[i]).getMoney());
                        pw.println(map.get(ar[i]).getTa().getTaocan()+":"+map.get(ar[i]).getTa()._1());
                        break;
                }else if (Objects.equals(s,"3")){
                    pw.println("请输入手机号:");
                    pw.println("");
                    pw.flush();
                    String s1 = br.readLine();
                    if (map.containsKey(s1)) {
                        String stat=null;
                        int stat1=0;
                        int p=0;
                        String pp=map.get(s1).getTa().getTaocan();
                        switch (pp) {
                            case "话唠套餐":
                                p = (int) (Math.random() * 4);
                                break;
                            case "网虫套餐":
                                int a=(int)(Math.random()*2);
                                p=4+a;
                                break;
                            case "超人套餐":
                                p = (int) (Math.random() * 6);
                                break;
                        }
                        if (p==0){
                            pw.println("问候客户，谁知其如此难缠 通话 90 分钟");
                            stat="通话";
                            stat1=90;
                        }else if (p==1){
                            pw.println( "通话 询问妈妈身体状况 本地通话 30 分钟");
                            stat="通话";
                            stat1=30;
                        }else if (p==2){
                            pw.println("参与环境保护实施方案问卷调查 发送短信 5 条");
                            stat="短信";
                            stat1=5;
                        }else if (p==3){
                            pw.println("通知朋友手机换号，发送短信 50 条");
                            stat="短信";
                            stat1=50;
                        }else if (p==4){
                            pw.println("和女友微信视频聊天 使用流量 1G");
                            stat="上网";
                            stat1=1;
                        }else if (p==5){
                            pw.println("晚上手机在线看韩剧，不留神睡着啦！ 使用流量 2G");
                            stat="上网";
                            stat1=2;
                        }
                        if (Objects.equals(stat, "通话")){
                        if (map.get(s1).getTa().getShichang() >= stat1) {
                            map.get(s1).getTa().setShichang(map.get(s1).getTa().getShichang() - stat1);
                        } else {
                            if ((map.get(s1).getMoney() / 0.2)>(stat1-map.get(s1).getTa().getShichang())){//余额除0.2得出还能打多少分钟  假如大于  要打的90分钟减去套餐剩余的分钟数
                                int v =  ((int)(map.get(s1).getMoney() / 0.2) - (stat1 - map.get(s1).getTa().getShichang()));//余额分钟减去 90分钟剩余的分钟数 V
                                map.get(s1).setMoney((v*0.2));                  //v乘0.2得出剩余余额
                            }else {  //反之 余额分钟小于剩余没打完的时间
                                map.get(s1).getTa().setShichang(0);
                                int v = (int) ( (stat1 - map.get(s1).getTa().getShichang())-(map.get(s1).getMoney() / 0.2));//剩余的分钟数减去余额分钟
                                map.get(s1).setMoney(0);//为零
                                stat1-=v; //得已打完的分钟
                            aaa x1=new aaa();
                            try {
                                x1.a(map.get(s1).getMoney());
                            } catch (Exception e) {
                                pw.println(e);
                                pw.println("已打"+stat1+"分钟:"+e.getMessage());
                            }
                            }
                        }
                        }else if (Objects.equals(stat, "短信")){
                                if (map.get(s1).getTa().getTiao() >= stat1) {
                                    map.get(s1).getTa().setTiao(map.get(s1).getTa().getTiao() - stat1);
                                } else {
                                    if ((map.get(s1).getMoney() / 0.1) > (stat1 - map.get(s1).getTa().getTiao())) {//余额除0.2得出还能发多少条短信  假如大于  要发的短信减去套餐剩余的短信
                                        int v = ((int) (map.get(s1).getMoney() / 0.1) - (stat1 - map.get(s1).getTa().getTiao()));//余额短信减去 需要发送的短信 V
                                        map.get(s1).setMoney((v * 0.1));                  //v乘0.2得出剩余余额
                                    } else {  //反之
                                        map.get(s1).getTa().setTiao(0);
                                        int v = (int) ((stat1 - map.get(s1).getTa().getTiao()) - (map.get(s1).getMoney() / 0.1));
                                        map.get(s1).setMoney(0);//为零
                                        stat1 -= v; //得已打完的分钟
                                        aaa x1 = new aaa();
                                        try {
                                            x1.a(map.get(s1).getMoney());
                                        } catch (Exception e) {
                                            pw.println(e);
                                            pw.println("已发" + stat1 + "条:" + e.getMessage());
                                        }
                                    }
                                }
                        }else if (Objects.equals(stat,"上网")){
                            double v1 = map.get(s1).getTa().getLiuliang(); //套餐内剩余流量
                            if ( v1>= stat1) {
                                map.get(s1).getTa().setLiuliang((int) (map.get(s1).getTa().getLiuliang() - stat1));
                            } else {//套餐内剩余流量小于需要的流量
                                map.get(s1).getTa().setLiuliang(0);//代表流量已用完,清零
                                double v2 = map.get(s1).getMoney() / 0.1/1024;//账户内的余额可以转成的流量
                                double v3 = stat1 - map.get(s1).getTa().getLiuliang();//用要用的流量减去套餐内流量余额 得 还需要多少流量
                                if (v2 > v3) { //若账户余额转换为流量 大于 需要的流量 ,
                                    double v = v2 - v3;//则减去,得出转换后所剩的流量
                                    map.get(s1).setMoney((v * 0.1));//再乘0.1得出账户所剩余额，写入余额
                                } else {  //反之,当余额转流量 小于 所需流量
                                    map.get(s1).setMoney(0);//则代表账户余额已用完,清零
                                    double v = v3 - v2;//则减去,得出还所需的流量
                                    double ee=stat1-v;//得出已用流量(套餐剩余流量+余额转流量)
                                    aaa x1 = new aaa();
                                    try {
                                        x1.a(map.get(s1).getMoney());
                                    } catch (Exception e) {
                                        pw.println(e);
                                        pw.println("已用" + ee + "G:" + e.getMessage());
                                    }
                                }
                            }
                        }
                        map.get(s1).getList().add(new jilu(stat,stat1+""));//写入消费记录
                    }else {
                        pw.println("查无此号");
                    }
                    break;
                }else if (Objects.equals(s,"4")){
                    pw.println("*********话费充值********");
                    pw.println("输入要充值的卡号:");
                    pw.println("");
                    pw.flush();
                    String s1 = br.readLine();
                    if (!map.containsKey(s1)){
                        pw.println("无此卡号");
                    }else {
                        pw.println("请输入充值金额:");
                        pw.println("");
                        pw.flush();
                        int i = Integer.parseInt(br.readLine());
                        map.get(s1).setMoney(map.get(s1).getMoney()+i);
                        pw.println("充值成功,当前话费余额:"+map.get(s1).getMoney());
                    }
                }else if (Objects.equals(s,"5")){
                    File file = new File("C:\\Users\\董\\IdeaProjects\\JAVA76\\高级特性\\src\\_嗖嗖移动大厅\\套餐资费说明.txt");
                    BufferedReader brr = new BufferedReader(new FileReader(file));
                    char[] ar=new char[1024];
                    int len=0;
                    String s1="";
                    while ((len=brr.read(ar))!=-1){
                        s1=s1+new String(ar,0,len);
                    }
                    pw.println(s1);
                    break ;
                }else if (Objects.equals(s,"end")){
                    pw.println("用户退出程序");
                    break js;
                }else {
                    pw.println("返回上级");
                    break ;
                }
            }
            xuliehua();
        }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
           try {
                if (is != null) {
                    is.close();
                }
                if (os != null) {
                    os.close();
                }
                if (br != null) {
                    br.close();
                }
                if (pw != null) {
                    pw.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}
//自定义异常
class aaa{
    private  double a;
    public void a(double a) throws Exception{
        if (a!=0){
            this.a=a;
        }else {
            throw new MyException(",您的余额不足,请充值后后使用！");
        }
    }
}


